import org.apache.thrift.TException;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

import study.apache.thrift.tutorial.Calculator;
import study.apache.thrift.tutorial.InvalidOperation;
import study.apache.thrift.tutorial.Work;
import study.apache.thrift.tutorial.shared.SharedStruct;

public class Server {
	/*
	 * 
	 * 在服务器这边，由这个类来真正处理客户端的请求。
	 */

	public static class CalculatorHandler implements Calculator.Iface {

		@Override
		public SharedStruct getStruct(int key) throws TException {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public void ping() throws TException {
			// TODO Auto-generated method stub

		}

		@Override
		public int add(int num1, int num2) throws TException {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public int calculate(int logid, Work w) throws InvalidOperation,
				TException {
			switch (w.op) {
			case ADD:
				return w.num1 + w.num2;
			case SUBTRACT:
				return w.num1 - w.num2;
			case MULTIPLY:
				return w.num1 * w.num2;
			case DIVIDE:
				if (w.num2 == 0) {
					throw new InvalidOperation(1, "divide by zero");
				}
				return w.num1 / w.num2;
			default:
				throw new InvalidOperation(0, "impossible code");
			}
		}

		@Override
		public void zip() throws TException {
			// TODO Auto-generated method stub

		}

	}

	public static void main(String[] args) {

		// 既然是RPC，那么我们在服务器需要有一个真正的类来处理客户端的请求

		Calculator.Processor processor = new Calculator.Processor(

		new CalculatorHandler());

		try {

			TServerTransport serverTransport = new TServerSocket(9090);

			// 服务端类型
			// * TSimpleServer - 单线程服务器端使用标准的堵塞式I/O。
			// * TThreadPoolServer - 多线程服务器端使用标准的堵塞式I/O。
			// * TNonblockingServer – 多线程服务器端使用非堵塞式I/O，并且实现了Java中的NIO通道。
			TServer server = new TSimpleServer(
					new TServer.Args(serverTransport).processor(processor));

			server.serve();

			// 跟Client的写法比起来，是不是觉得少了TProtocol？
			// 因为TServer.Args默认设置的TProtocol是TBinaryProtocol，因此就不显示指定了。

		} catch (TTransportException e) {

			e.printStackTrace();

		}

	}

}
